import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { useUserStore, useCartStore } from '@/stores'
import { message } from 'ant-design-vue'
import { addCartApi } from '@/api'

/**
 * @name 未登录拦截函数
 * @param {Function} callback 回调函数
 * @returns {Function} 未登录拦截函数
 */
export const useUnLogin = (callback) => {
  if (typeof callback !== 'function') {
    throw new Error('callback 必须是一个函数')
  }
  const router = useRouter()
  const { token } = useUserStore()
  // 未登录拦截函数
  const unLoginCallback = () => {
    // 登录
    if (token) {
      // 执行回调函数
      callback()
    } else {
      // 未登录
      message.error('Please log in first')
      // 跳转到登录页
      router.push({ name: 'login' })
    }
  }
  // 返回未登录拦截函数
  return unLoginCallback
}

/**
 * @name 防抖函数
 * @param {Function} callback 回调函数
 * @param {Number} delay 延迟时间，默认为 500ms
 * @param {Boolean} immediate 是否立即执行，默认为 false
 * @returns {Function} 防抖函数
 */
export const useDebounce = (callback, delay = 500, immediate = false) => {
  if (typeof callback !== 'function') {
    throw new Error('callback 必须是一个函数')
  }
  if (typeof delay !== 'number' || delay < 0) {
    throw new Error('delay 必须是一个正整数')
  }
  if (typeof immediate !== 'boolean') {
    throw new Error('immediate 必须是一个布尔值')
  }
  // 定时器
  const timer = ref(null)
  // 立即执行
  let isInvoke = immediate
  // 防抖函数
  const debouncedCallback = (...args) => {
    // 清除定时器
    if (timer.value) {
      clearTimeout(timer.value)
    }
    // 立即执行
    if (isInvoke) {
      isInvoke = false
      // 执行回调函数
      callback(...args)
    } else {
      // 延迟执行
      timer.value = setTimeout(() => {
        // 执行回调函数
        callback(...args)
        // 清除定时器
        timer.value = null
      }, delay)
    }
  }
  // 返回防抖函数
  return debouncedCallback
}

/**
 * @name 加入购物车
 * @param {String} game_id
 * @param {String} area_id
 * @param {Object} goods
 */
export const useAddCart = (game_id, area_id, goods) => {
  const { token } = useUserStore()
  const { addNoLoginCart } = useCartStore()
  // 已登录
  if (token) {
    const params = {
      game_id,
      area_id,
      sku: goods.sku,
      num: goods.num,
    }
    addCartApi(params).then(() => {
      message.success('Add to cart successfully')
    })
  } else {
    // 未登录，将商品添加至本地保存
    addNoLoginCart(game_id + '_' + area_id, goods)
    message.success('Add to cart successfully')
  }
}
